/**
 * Copyright (c) iwindplus Technologies Co., Ltd.2024-2030, All rights reserved.
 */

package com.iwindplus.boot.oss.service.impl;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.IdUtil;
import com.iwindplus.boot.domain.constant.CommonConstant;
import com.iwindplus.boot.domain.constant.CommonConstant.FileConstant;
import com.iwindplus.boot.domain.enums.BizCodeEnum;
import com.iwindplus.boot.domain.exception.BizException;
import com.iwindplus.boot.oss.service.OssBaseService;
import jakarta.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties;

/**
 * 对象存储业务层基础抽象类.
 *
 * @author zengdegui
 * @since 2020/3/13
 */
@Slf4j
public abstract class AbstractOssBaseServiceImpl extends AbstractOssBaseConfigServiceImpl implements OssBaseService {
    @Resource
    private MultipartProperties multipartProperties;

    /**
     * 获取服务器上传目录（应用所在的位置）.
     *
     * @return String
     */
    protected String getRootPath() {
        return Optional.ofNullable(this.multipartProperties.getLocation()).orElse(System.getProperty(FileConstant.USER_DIR));
    }

    /**
     * 获取相对路径（包含后缀）.
     *
     * @param prefix   存储目录前缀（必填）
     * @param fileName 文件名，包含文件后缀（必填）
     * @return String
     */
    protected String getRelativePath(String prefix, String fileName) {
        if (CharSequenceUtil.isBlank(prefix)) {
            throw new BizException(BizCodeEnum.FILE_DIR_EMPTY);
        }
        String suffix = FileUtil.getSuffix(fileName);
        if (CharSequenceUtil.isBlank(suffix)) {
            throw new BizException(BizCodeEnum.FILE_HAS_NOT_SUFFIX);
        }
        StringBuilder sb = new StringBuilder(prefix).append(CommonConstant.SymbolConstant.SLASH)
                .append(DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATE_PATTERN))
                .append(CommonConstant.SymbolConstant.SLASH).append(fileName);
        return sb.toString();
    }

    /**
     * 重命名文件名（包含后缀）.
     *
     * @param path     路径（必填）
     * @param fileName 新文件名（必填）
     * @return String
     */
    protected String getNewFileName(String path, String fileName) {
        String suffix = FileUtil.getSuffix(path);
        if (CharSequenceUtil.isBlank(suffix)) {
            throw new BizException(BizCodeEnum.FILE_HAS_NOT_SUFFIX);
        }
        if (CharSequenceUtil.isBlank(fileName)) {
            return FileNameUtil.getName(path);
        }
        return new StringBuilder(FileUtil.getPrefix(fileName.trim())).append(CommonConstant.SymbolConstant.POINT)
                .append(suffix).toString();
    }

    /**
     * 重命名文件名，文件名随机（包含后缀）.
     *
     * @param renamed        是否重命名文件名（必填）
     * @param sourceFileName 原文件，包含后缀（必填）
     * @return String
     */
    protected String getNewFileName(Boolean renamed, String sourceFileName) {
        if (Boolean.FALSE.equals(renamed)) {
            return sourceFileName.trim();
        }
        String suffix = FileUtil.getSuffix(sourceFileName);
        if (CharSequenceUtil.isBlank(suffix)) {
            throw new BizException(BizCodeEnum.FILE_HAS_NOT_SUFFIX);
        }
        return new StringBuilder(IdUtil.getSnowflakeNextIdStr()).append(CommonConstant.SymbolConstant.POINT)
                .append(suffix).toString();
    }

    /**
     * 校验文件大小.
     *
     * @param data 字节数组
     */
    protected void checkFile(byte[] data) {
        long fileSize = data.length;
        long maxFileSize = this.multipartProperties.getMaxFileSize().toBytes();
        if (fileSize > maxFileSize) {
            throw new BizException(BizCodeEnum.FILE_TOO_BIG, new Object[]{fileSize});
        }
    }
}
